package com.linxuan.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.linxuan.reggie.common.BaseContext;
import com.linxuan.reggie.common.R;
import com.linxuan.reggie.entity.ShoppingCart;
import com.linxuan.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 购物车控制层
 */
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 添加购物车信息，前端前台用户点击菜品/套餐的添加购物车选项会将菜品/套餐信息发送过来要求添加至购物车
     *
     * @param shoppingCart 用户要求添加至他的购物车的菜品/套餐数据，注意没有份数数据，重复发送添加份数
     * @return 返回添加成功
     */
    @PostMapping("/add")
    public R<String> addShoppingCart(@RequestBody ShoppingCart shoppingCart) {
        // 获取到当前登录用户的ID，并设置该条购物车数据的userId，指定当前是哪个用户的购物车数据
        Long userId = BaseContext.getCurrentId();
        shoppingCart.setUserId(userId);

        // 查询当前菜品/套餐是否已经在购物车中存在，添加条件
        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, userId);

        // 获取到前端传过来的菜品ID，通过判断该ID是否为null，可以得知前端传过来的是菜品还是套餐
        Long dishId = shoppingCart.getDishId();

        // 如果菜品ID为null，那么代表传过来的是套餐，那么我们查询该套餐是否已经在购物车中存在
        if (dishId == null) {
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
        } else {
            // 菜品ID不为null，代表前端传过来的是菜品，那么查询该菜品是否在购物车中存在
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getDishId, dishId);
        }
        // 得到查询出来的购物车数据
        ShoppingCart shoppingCartBySelect = shoppingCartService.getOne(shoppingCartLambdaQueryWrapper);

        // 如果查询购物车查询出来数据那么代表购物车中有该菜品/套餐，那么需要将其份数+1
        if (shoppingCartBySelect != null) {
            Integer number = shoppingCartBySelect.getNumber();
            shoppingCartBySelect.setNumber(++number);
            shoppingCartService.updateById(shoppingCartBySelect);
        } else {
            // 没有数据，那么将其数量设置为1并添加进去
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartService.save(shoppingCart);
        }

        return R.success("添加成功");
    }


    /**
     * 查询当前登录系统前台用户的购物车数据并回显至前端
     *
     * @return 查询出来的用户购物车数据
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> shoppingCartList() {

        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        shoppingCartLambdaQueryWrapper.orderByDesc(ShoppingCart::getCreateTime);
        List<ShoppingCart> list = shoppingCartService.list(shoppingCartLambdaQueryWrapper);
        if (list != null) {
            return R.success(list);
        }
        return R.error("查询失败！");
    }

    /**
     * 前端用户点击「清空」按钮，要求后端将数据库中该用户的购物车信息清空
     *
     * @return 返回是否清除成功
     */
    @DeleteMapping("/clean")
    public R<String> cleanShoppingCart() {
        // 获取当前登录用户ID
        Long userId = BaseContext.getCurrentId();
        // 清除购物车表中当前登录用户的购物车信息
        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        shoppingCartLambdaQueryWrapper.eq(userId != null, ShoppingCart::getUserId, userId);
        if (shoppingCartService.remove(shoppingCartLambdaQueryWrapper)) {
            return R.success("清除成功");
        }
        return R.error("清除失败");

    }


    /**
     * 前端用户发送菜品/套餐ID，要求在购物车表中减去该菜品/套餐的数量
     * @param shoppingCart 接收前端传过来的菜品/套餐ID
     * @return 返回是否修改成功
     */
    @PostMapping("/sub")
    public R<String> sub(@RequestBody ShoppingCart shoppingCart) {
        // 获取到前端传过来的菜品/套餐ID，其中一个为null
        Long setmealId = shoppingCart.getSetmealId();
        Long dishId = shoppingCart.getDishId();

        // 查询当前菜品/套餐在购物车表中的信息
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());

        // 如果查询的是套餐
        if (setmealId != null) {
            queryWrapper.eq(ShoppingCart::getSetmealId, setmealId);
        } else {
            // 如果查询的是菜品
            queryWrapper.eq(ShoppingCart::getDishId, dishId);
        }

        // 查询菜品/套餐信息的结果
        ShoppingCart shoppingCartBySelect = shoppingCartService.getOne(queryWrapper);
        // 得到该菜品/套餐的数量
        Integer number = shoppingCartBySelect.getNumber();
        // 如果数量为1，那么减去之后直接删除即可
        if (number == 1) {
            shoppingCartService.remove(queryWrapper);
        } else {
            // 修改菜品/套餐数量，进行减一，然后直接进行修改
            shoppingCartBySelect.setNumber(number - 1);
            shoppingCartService.updateById(shoppingCartBySelect);
        }

        return R.success("减少成功");
    }
}
